package com.demo.money.inteceptor;

import com.demo.money.kit.IpUtils;
import com.demo.money.model.Ip;
import com.demo.money.service.IpService;
import com.demo.money.service.impl.IpServiceImpl;
import lombok.extern.java.Log;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.logging.Logger;

/**
 * IpInteceptor类<br>
 * 记录登录ip
 * <p>
 * <b>preHandle：</b>在业务处理器处理请求之前被调用。预处理，可以进行编码、安全控制、权限校验等处理；<br>
 * <b>postHandle：</b>在业务处理器处理请求执行完成后，生成视图之前执行。后处理（调用了Service并返回ModelAndView，但未进行页面渲染），有机会修改ModelAndView ；<br>
 * <b>afterCompletion：</b>在DispatcherServlet完全处理完请求后被调用，可用于清理资源等。返回处理（已经渲染了页面）；
 * <p>
 * <b>全类名</b>:com.demo.money.inteceptor<br>
 * <b>类名</b>:IpInteceptor<br>
 * <b>创建者</b>:张峰浦<br>
 * <b>创建时间</b>:2020/4/4 15:59<br>
 */
@Slf4j
public class IpInteceptor implements HandlerInterceptor {

    public IpInteceptor() {
        super();
    }

    public IpInteceptor(IpService ipService) {
        this.ipService = ipService;
    }

    private IpService ipService;



    /**
     * 在业务处理器处理请求之前被调用。预处理，可以进行编码、安全控制、权限校验等处理；
     *
     * @param request  获取 HTTP request
     * @param response 获取 HTTP response
     * @param handler  获取映射方法的参数
     * @return 如果返回true，执行链应继续处理下一个拦截器或处理程序本身。<br>
     * 否则，DispatcherServlet假设这个拦截器已经处理了响应本身
     * @throws Exception 异常处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ip = IpUtils.getIpAddr(request);
        String url = String.valueOf(request.getRequestURL());

        log.trace("访问者="+ip+"---"+"安全性="+ip.equals("127.0.0.1")+"---"+"请求="+url);

        if (ip.equals("127.0.0.1") || ip.equals("171.113.128.183")){
            return true;
        }
        ipService.insert(new Ip(null,ip,url,new Date()));
        return true;
    }

    /**
     * 在业务处理器处理请求执行完成后，生成视图之前执行。后处理（调用了Service并返回<br>
     * ModelAndView，但未进行页面渲染），有机会修改ModelAndView ；
     *
     * @param request      获取 HTTP request
     * @param response     获取 HTTP response
     * @param handler      获取映射方法的参数
     * @param modelAndView 用来存储处理完后的结果数据，以及显示该数据的视图
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    }

    /**
     * 在DispatcherServlet完全处理完请求后被调用，可用于清理资源等。返回处理（已经渲染了页面）；
     *
     * @param request  获取 HTTP request
     * @param response 获取 HTTP response
     * @param handler  获取映射方法的参数
     * @param ex       拦截器判断存在异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    }
}
